﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[0];
//	printf("&arr[0]  =%p\n", &arr[0]);  //00F8F948
//	printf("&arr     =%p\n", &arr);		//00F8F948
//	printf("p        =%p\n", p);		//00F8F948
//	//数组名本来就是地址，而且是数组首元素的地址
//	//数组名就是数组首元素(第⼀个元素)的地址。
//	return 0;
//}


//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("%zd\n", sizeof(arr));
//	//例外：
//	//1. sizeof(数组名)，sizeof中单独放数组，
//	//这里的数组名表示整个数组，计算的是整个数组的大小，
//	//单位是字节
//	//2. &数组名，这里的数组名表示整个数组，
//	//取出的是整个数组的地址
//	//(整个数组的地址和数组的首元素的地址是有区别的)
//	//3. 除此之外，任何地方使用数组名，
//	//数组名都表示首元素的地址
//	return 0;
//}


//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("&arr[0]=    %p\n", &arr[0]);
//	printf("arr    =    %p\n", arr);
//	printf("&arr   =    %p\n", &arr);
//	//可以得到三个打印结果一模一样，那arr和&arr有什么区别呢
//	return 0;
//}



int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("&arr[0]  =%p\n", &arr[0]);  //005EFBE0
	printf("&arr[0]+1=%p\n", &arr[0]+1);//005EFBE4
	printf("arr      =%p\n", arr);		//005EFBE0
	printf("arr + 1  =%p\n", arr + 1);  //005EFBE4
	printf("&arr     =%p\n", &arr);		//005EFBE0
	printf("&arr + 1 =%p\n", &arr + 1); //005EFC08
	//可以发现&arr[0]和&arr[0]+1相差4个字节
	//arr和arr+1相差4个字节
	//这是因为&arr和arr都是首元素的地址，
	//+1就是跳过一个元素
	//但是&arr和&arr+1相差40个字节
	//这是因为&arr是数组的地址，
	//+1就是跳过整个数组
	return 0;
}
